"""
类 哈希的定义
    1、默认创建的类，实例化对象都是可哈希的
    2、只重写__eq__方法的类，实例化对象都是不可哈希的
    3、重写__eq__方法和__hash__方法的类，创建的对象都是可哈希的
哈希值是一个整数，保持运行中的程序，可哈希对象的哈希值相同
"""
import collections


class DefaultCreateClass(object):

    def __init__(self):
        self.name = 'defaultCreateClass'


class EqCreateClass(object):

    def __init__(self):
        self.name = 'eqCreateClass'

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            if self.name == other.name:
                return True
        else:
            return False


class HashCreateClass(object):

    def __init__(self):
        self.name = 'hashCreateClass'

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            if self.name == other.name:
                return True
        else:
            return False

    def __hash__(self):
        # 我们默认使用str的默认hash方法返回整数
        print('str包含__hash__的哈希方法: ', hasattr('', '__hash__'))
        return hash(self.__class__.__name__ + self.name)


if __name__ == '__main__':
    default_class_1 = DefaultCreateClass()
    eq_class_1 = EqCreateClass()
    hash_class_1 = HashCreateClass()
    # 默认类对象 是可哈希的
    print(isinstance(default_class_1, collections.Hashable))
    # 重写__eq__方法的对象 是不可哈希的
    print(isinstance(eq_class_1, collections.Hashable))
    # 重写__eq__和__hash__方法 是可哈希的
    print(isinstance(hash_class_1, collections.Hashable))

    print(hash(default_class_1))
    print(hash(hash_class_1))

